home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / qlib205.zip / QLIB.ZIP / SRC / QLIB / LOCK.ASM < prev    next >
Assembly Source File  |  1997-01-09  |  3KB  |  123 lines

  1. include qlib.inc
  2.  
  3. .data
  4. externdef _baseram:dword     ;... don't want user to touch cause malloc sceme may change
  5.                              
  6. ;RAM header
  7. heads struct  ;12bytes
  8.   magic dw ? ; 'PQ' ;signature
  9.   flag db ?  ;bit0=free(1)  bit1=last(2)   (1==true)
  10.   _a1 db ?   ;junk byte for alignment (not used!)
  11.   prev dd ?  ;ptr=>previous block
  12.   siz dd ?   ;size of this block
  13. heads ends
  14.  
  15. .code
  16. lock_ram proc,off:dword,siz:dword
  17.   .if _pmmode<SRV_DPMI
  18.     xor eax,eax
  19.     ret
  20.   .endif
  21.   pushad
  22.   mov ax,600h
  23.   mov ebx,off
  24.   mov esi,siz
  25.   mov cx,bx
  26.   mov di,si
  27.   shr ebx,16
  28.   shr esi,16
  29.   int 31h
  30.   jc bad
  31.   popad
  32.   xor eax,eax
  33.   ret
  34. bad:
  35.   popad
  36.   mov eax,ERROR
  37.   ret
  38. lock_ram endp
  39.  
  40. unlock_ram proc,off:dword,siz:dword
  41.   .if _pmmode<SRV_DPMI
  42.     xor eax,eax
  43.     ret
  44.   .endif
  45.   pushad
  46.   mov ax,601h
  47.   mov ebx,off
  48.   mov esi,siz
  49.   mov cx,bx
  50.   mov di,si
  51.   shr ebx,16
  52.   shr esi,16
  53.   int 31h
  54.   jc bad
  55.   popad
  56.   xor eax,eax
  57.   ret
  58. bad:
  59.   popad
  60.   mov eax,ERROR
  61.   ret
  62. unlock_ram endp
  63.  
  64. ;this call will LOCK all RAM possible
  65. ;iff useonly==1 then it makes sure you only alloc RAM from the locked RAM
  66. ;you must call this before you ever call malloc() (else this will fail)
  67.  
  68. locksiz equ 4*1024    ;this is the size to lock each time
  69. lockbtz equ 12        ;this is # bits that locksiz is equal to
  70. lock_all proc,useonly:byte
  71.   ; MAKE SURE YOU PRINT A MESSAGE LIKE "LOCKING MEMORY..." cause locking
  72.   ; 16 MBs RAM under Win95 takes about 3 mins.. (which I suggest you never
  73.   ; do)  just lock important parts (around 1-2 megs at max)
  74.   mov eax,_baseram
  75.   mov al,[eax].heads.flag
  76.   or al,3          ;last and free?
  77.   .if al!=3  
  78.     mov eax,ERROR  ;nope!
  79.     ret
  80.   .endif
  81.   pushad
  82.   mov ebx,_baseram
  83.   .if _pmmode<SRV_DPMI  ;not in DPMI mode
  84.     mov eax,[ebx].heads.siz
  85.     mov [esp+7*4],eax
  86.     popad
  87.     ret
  88.   .endif
  89.   mov ecx,[ebx].heads.siz
  90.   shr ecx,lockbtz  ;make divisable by 4K
  91.   dec ecx          ;do not use last 4k fragment
  92.   xor edx,edx      ;final size
  93. @@:
  94.   callp lock_ram,ebx,locksiz
  95.   .if eax==ERROR
  96.     .if useonly
  97.       sub edx,sizeof heads
  98.       mov ebx,_baseram
  99.       mov [ebx].heads.siz,edx
  100.     .else
  101.       sub edx,sizeof heads
  102.       mov ebx,_baseram
  103.       mov [ebx].heads.siz,edx
  104.     .endif
  105.     mov [esp+7*4],edx  ;total locked (into EAX)
  106.     popad
  107.     ret
  108.   .endif
  109.   add edx,locksiz
  110.   add ebx,locksiz
  111.   dec ecx
  112.   jnz @b
  113. ;all pages locked
  114.   sub edx,sizeof heads
  115.   mov ebx,_baseram
  116.   mov [ebx].heads.siz,edx
  117.   mov [esp+7*4],edx  ;total locked (into EAX)
  118.   popad
  119.   ret
  120. lock_all endp
  121.  
  122. end
  123.